<?php

namespace app\common\library;

use fast\Random;

/**
 * 图片处理
 */
class Image
{

    //绝对路径
    protected static $basepath = "/www/wwwroot/admin.xchengguang.com/runzhi-grading/public";

    /**
     * 改变图片格式为png或jpg
     *
     * @param string $image 图片路径
     * @param string $outputFile 图片保存路径
     * @param string $format 格式为 PNG 或 JPEG
     * @return void
     */
    public static function format($image, $outputFile, $format = 'png')
    {
        $canvas = new \Imagick($image);
        // 获取图片尺寸
        $width = $canvas->getImageWidth();
        $height = $canvas->getImageHeight();
        if ($height < 4500 && $width > $height) {
            // 执行旋转操作
            $canvas->rotateImage(new \ImagickPixel(), -90);
        }else if ($height >= 4500 && $height > $width){
            // 执行旋转操作
            $canvas->rotateImage(new \ImagickPixel(), -90);
        }
        
        //设置输出格式为 PNG 或 JPEG
        $canvas->setImageFormat($format);
        //保存转换后的图片
        $canvas->writeImage(self::$basepath . $outputFile);
        //销毁对象
        $canvas->clear();
        // 释放资源
        $canvas->destroy();
    }

    /**
     * 旋转图片
     *
     * @param string $image 图片路径
     * @param string $outputFile 图片保存路径
     * @param integer $angle 旋转角度
     * @return void
     */
    public static function rotate($image, $outputFile, $angle = 45)
    {
        $canvas = new \Imagick($image);
        // 执行旋转操作
        $canvas->rotateImage(new \ImagickPixel(), $angle);
        $canvas->writeimage(self::$basepath . $outputFile);
        //销毁对象
        $canvas->clear();
        $canvas->destroy();
    }

    /**
     * 倾斜图片
     *
     * @param string $image 图片路径
     * @param string $outputFile 图片保存路径
     * @param integer $angle 旋转角度
     * @return void
     */
    public static function shear($image, $outputFile, $angle = 45)
    {
        $canvas = new \Imagick($image);
        
        // 执行旋转操作
        $canvas->shearImage(new \ImagickPixel('#ffffff'), $angle,0);
        $canvas->writeimage(self::$basepath . $outputFile);
        //销毁对象
        $canvas->clear();
        $canvas->destroy();
    }


    /**
     * 合成图片
     * @param  string      $output_url 图片保存路径
     * @param  string      $img_type   图片保存类型
     * @param  int    $line_num   每行显示图片数量
     * @param  array       $logo_info  每张待合成图片的信息（要求所有尺寸统一）
     * @param  array       $img_list  待合成的图片绝对路径
     * @return void
     */
    public static function generate($output_url, $img_type, $line_num = 1, $img_list = array())
    {

        //计算图片有多少行
        $lines = ceil(count($img_list) / $line_num);

        $bg_width = 900;
        $bg_height = 600;
        $image_width = bcdiv($bg_height, $lines, 0);
        //构建画布
        $canvas = null;
        $canvas = new \Imagick();
        $canvas->newimage($bg_width, $bg_height, 'white');
        //设置输出格式为 PNG 或 JPEG
        $canvas->setimageformat($img_type);

        $i = $j = 0;
        foreach ($img_list as $item) {
            $im = new \Imagick(self::$basepath . $item);
            $im->readImage(self::$basepath . $item);
            // 获取图片宽x高
            $geo = $im->getImageGeometry();
            if ($geo['width'] !== $bg_width || $geo['height'] !== $image_width) {
                // 调整尺寸
                $im->resizeImage($bg_width, $image_width, \Imagick::FILTER_UNDEFINED, 1, TRUE);
            }
            // 左边
            $x = $i * 900;
            // 顶边距
            $y = $j * 300;
            $canvas->compositeimage($im, \Imagick::COMPOSITE_OVER, $x, $y);
            // 每1张一行
            if (($i + 1) % 1 === 0) {
                $i = 0;
                $j++;
            } else {
                $i++;
            }
        }

        $canvas->writeimage(self::$basepath . $output_url);

        //销毁对象
        $canvas->clear();
        $canvas->destroy();
    }

    /**
     * 裁剪图片
     *
     * @param string $imagePath 待裁剪的图片路径
     * @param string $outputPath 裁剪后的图片路径
     * @param float $cropWidth 宽
     * @param float $cropHeight 高
     * @param float $cropX  x轴坐标
     * @param float $cropY y轴坐标
     * @return void
     */
    public static function cropImage($imagePath,$outputPath,$cropWidth,$cropHeight,$cropX,$cropY)
    {

        // 创建Imagick对象并加载图片
        $image = new \Imagick(self::$basepath . $imagePath);

        // 获取图片尺寸
        $width = $image->getImageWidth();
        $height = $image->getImageHeight();

        // 进行裁剪
        $image->cropImage($cropWidth, $cropHeight, $cropX, $cropY);

        // 保存裁剪后的图片
        $image->writeImage(self::$basepath . $outputPath);
        //销毁对象
        $image->clear();
        // 释放资源
        $image->destroy();
    }
}
